package com.zf.yichat.utils.HJpay.com.sdk.utils;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
import java.util.Base64;

/**
 * AES加解密工具类
 * @author chenyf
 * @date 2018-12-15
 */
public class AESUtil {
	//   private static final Logger logger = LoggerFactory.getLogger(AesUtils.class);
	    public static final String ALGORITHM = "AES/ECB/PKCS5Padding";
	    public static final String UTF_8 = "UTF-8";
	    public static final String AES = "AES";
	    public static final String BC = "BC";


	    static {
	        //仅加载一次，不要多次加载，可能会导致内存溢出
	        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
	    }

	    /**
	     * 网联敏感字段AES加密
	     *
	     * @param str 敏感字段原文
	     * @param key AES密钥 必须是8位、16位、24位
	     * @return
	     */
	    public static String Aes256Encode(String str, String key) {
	      //  if(StringUtil.isNotBlank(str)) {
	            try {
	                Cipher cipher = Cipher.getInstance(ALGORITHM, BC);
	                SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(UTF_8), AES); // 生成加密解密需要的Key
	                cipher.init(Cipher.ENCRYPT_MODE, keySpec);
	                byte[] result = cipher.doFinal(str.getBytes(UTF_8));
	                return Base64.getEncoder().encodeToString(result);
	            } catch (Exception e) {
	               // logger.error("Aes256Encode error:", e);
	                return null;
	            }

	    }

	    /**
	     * 网联敏感字段密文解密
	     *
	     * @param base64Str 要被解密的密文.做了base64编码 base64Str
	     * @param key       AES密钥 必须是8位、16位、24位
	     * @return 解密后的字符串
	     */
	    public static String Aes256Decode(String base64Str, String key) {
	       // if (StringUtil.isNotBlank(base64Str)) {
	            String result = null;
	            try {
	                Cipher cipher = Cipher.getInstance(ALGORITHM, BC);
	                SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(UTF_8), AES); // 生成加密解密需要的Key
	                cipher.init(Cipher.DECRYPT_MODE, keySpec);
	                byte[] decoded = cipher.doFinal(Base64Util.decode(base64Str));
	                result = new String(decoded, "UTF-8");
	            } catch (Exception e) {
	                e.printStackTrace();
	            }
	            return result;
	    }


	}
